from qb import loadQb, randomQbData, getUserQbData, listToStr, checkQbData, getUserResult, getIp, QUESTION_CONFIG
from flask import *
import random
from copy import deepcopy
from gevent import pywsgi
from gevent import monkey

monkey.patch_all()  # 猴子补丁


# app实例
app = Flask(__name__)

"""
缓存
QB_DATA缓存excel表格题库数据
USER_QB_DATA缓存用户随机的题库数据
"""
# 题库数据缓存[[单选题,], [多选题,], [判断题,]]
QB_DATA = loadQb('static/qb.xlsx')
# 用户题库数据缓存 {ip: [单选题, 多选题, 判断题],}
USER_QB_DATA = {}
# 成绩缓存[[name, class, result],]
RESULT_DATA = []

psw = ""
characters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
              'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
for i in range(8):
    psw += random.choice(characters)


@app.route('/', methods=['GET', 'POST'])
def question():
    """
    答题|解析
    :return:
    """
    if request.method == 'GET':
        # 深拷贝数据,保证原始数据不被修改
        data = deepcopy(QB_DATA)
        # 随机题库数据
        randomQbData(data)
        # 获取用户题库数据
        userQbData = getUserQbData(data)
        # 缓存用户题库数据 {ip: [[单选题],[多选题],[判断题],],}
        USER_QB_DATA[request.remote_addr] = userQbData
        # 组合数据
        cont = {
            'data': userQbData
        }
        return render_template('question.html', **cont)
    else:
        # 获取用户
        name = request.form.get('name')
        # 获取班级
        qcls = request.form.get('qcls')
        # 获取用户题库缓存数据
        userQbData = USER_QB_DATA[request.remote_addr]
        # 清除用户缓存
        del USER_QB_DATA[request.remote_addr]
        # 用户题库缓存数据后追加用户答题结果
        for qb in userQbData:
            qb.append(listToStr(request.form.getlist(str(qb[0]))))
        # 检查答题结果
        checkQbData(userQbData)
        # 获取成绩
        result = getUserResult(userQbData)
        # 添加成绩缓存
        RESULT_DATA.append([name, qcls, result])
        # 组合数据
        cont = {
            'data': userQbData,
            'name': name,
            'qcls': qcls,
            'result': result
        }
        return render_template('result.html', **cont)


@app.route('/admin/{}'.format(psw))
def admin():
    cont = {
        'url': f'http://{getIp()}'
    }
    return render_template('admin.html', **cont)


@app.route('/results')
def results():
    """
    成绩
    :return:
    """
    cont = {
        'data': RESULT_DATA
    }
    return render_template('results.html', **cont)


@app.route('/admin', methods=['GET', 'POST'])
def admin_error():
    ip = request.remote_addr
    if ip == '127.0.0.1':
        return "请使用安全入口登录系统！"
    else:
        print("ip地址为{}的学生尝试使用url登录后台，已经及时拦截".format(ip))
        return "如果您是学生，教师端现在会收到一条警告，请您立即停止您的行动；\n如果您是教师，请使用安全入口登录系统！"


@app.errorhandler(404)
def page_unauthorized(error):
    error_page = """
<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>电视猪在线答题系统 V1.0.0</title>
        <style>
            footer {
                /*border: 1px red solid;*/
                clear: both;
                display: block;
                text-align: center;
                width: 100%;
                height: 120px;
                min-width: 610px;
                /* 保证文字inline-block效果时不换行 */
            }

            button {
                /* 按钮美化 */
                width: 270px;
                /* 宽度 */
                height: 40px;
                /* 高度 */
                border-width: 0;
                /* 边框宽度 */
                border-radius: 3px;
                /* 边框半径 */
                background: #1E90FF;
                /* 背景颜色 */
                cursor: pointer;
                /* 鼠标移入按钮范围时出现手势 */
                outline: none;
                /* 不显示轮廓线 */
                font-family: Microsoft YaHei;
                /* 设置字体 */
                color: white;
                /* 字体颜色 */
                font-size: 17px;
                /* 字体大小 */
            }
            button:hover {
                /* 鼠标移入按钮范围时改变颜色 */
                background: #5599FF;
            }
            input[type = "text"] {
                outline-style: none;
                border: 1px solid #ccc;
                border-radius: 3px;
                padding: 14px;
                width: 620px;
                font-size: 16px;
            }
            body {
                background-image: url("https://static.runoob.com/images/mix/paper.gif");
                background-color: #cccccc;
            }

            * {
                margin: 0;
                padding: 0;
            }

            ul {
                list-style: none;
            }

            .main {
                width: 800px;
                margin: 0 auto;
                text-align: center;
                overflow: hidden;
            }

            .title {
                margin-top: 30px;
                font-size: 30px;
                font-weight: bold;
            }

            .info {
                margin-top: 30px;
            }

            .info li {
                margin-top: 10px;
            }

            .url {
                font-weight: bold;
                margin-top: 30px;
            }
        </style>
    </head>
    <body>
        <div class="main">
            <div class="title">答题系统发生了错误</div>
            <ul class="info">
                <li>
                    <a href="/" target="_blank">
                        <button type="button">返回学生答题页面</button>
                    </a>
                </li>
            </ul>
        </div>
        <br/>
        <br/><br/><br/>
        <footer>
            <p>© Copyright 2021 Hello8693</p>
        </footer>
    </body>
</html>
"""
    return error_page


@app.route('/config', methods=['GET', 'POST'])
def config():
    """
    设置
    :return:
    """
    if request.method == 'GET':
        cont = {
            'data': QUESTION_CONFIG
        }
        return render_template('config.html', **cont)
    else:
        data = request.form.to_dict()
        for k, v in data.items():
            QUESTION_CONFIG[k] = v
        return redirect('/config')


if __name__ == '__main__':
    print('Welcome To TVZHU Exam System!\nVersion: 1.0.0\n')
    print('请用浏览器打开下面的链接：')
    print('http://127.0.0.1/admin/{}'.format(psw))
    print('#' * 30)
    server = pywsgi.WSGIServer(('0.0.0.0', 80), app)
    server.serve_forever()
